/* Based on array */
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAXSIZE 20
#define ERROR -1

typedef int ElementType;
typedef int Position;
typedef struct PolyNode* PtrToLNode;
struct PolyNode 
{
    ElementType Data[MAXSIZE];
    Position last;
};
typedef PtrToLNode List;

List MakeEmpty()
{
    List L = malloc(sizeof(struct PolyNode));
    L->last = -1;
    return L;
}

Position Find(List L, ElementType x)
{
    // int i;
    // for (i = 0; i < L->last + 1; i++)
    // {
    //     if (x == L->Data[i])
    //         return i;
    // }
    // return ERROR;
    Position i = 0;
    while (i <= L->last && L->Data[i] != x)
        i++;
    if (i > L->last)
        return ERROR;
    return i;
}

bool Insert(List L, ElementType x, int i)
{
    if (L->last == MAXSIZE - 1)
        return false;
    if (i < 1 || i > L->last + 2)
        return false;
    
    Position j = L->last;
    while (j >= i - 1)
    {
        L->Data[j + 1] = L->Data[j];
        j--;
    }
    L->Data[i - 1] = x;
    L->last++;
    return true;
}

bool Delete(List L, int i)
{
    if (i < 1 || i > L->last + 1)
        return false;
    Position j = i;
    while (j <= L->last)
    {
        L->Data[j - 1] = L->Data[j];
        j++;
    }
    L->last--;
    return true;
}

int main()
{
    List L = MakeEmpty();
    Insert(L, 1, 1);
    Insert(L, 2, 2);
    Insert(L, 3, 3);
    Insert(L, 4, 4);
    Insert(L, 5, 5);
    Delete(L, 4);
    for (int i = 0; i <= L->last; i++)
    {
        printf("%d\n", L->Data[i]);
    }
}
